package com.dongdongshop.log;
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/*
* 日志切面类
* */
@Component
@Aspect//声明此类为切面类
public class LogAspect {
    public Logger logger = LoggerFactory.getLogger(LogAspect.class);

    // 1.切点表达式 .2,通知 (前置通知,后置通知 ,异常通知,环绕通知,返回后通知)
    //*代表所有的公共返回值                             // 包下所有的类中的所有的方法,括号中是所有的参数
        @Pointcut("execution(public * com.dongdongshop.service.*.*(..))")
        public void aopLog(){

        }
        //前置通知
            @Before("aopLog()")
        public void doBefore(JoinPoint joinPoint){
            //打印参数和返回值
                Object[] args = joinPoint.getArgs();//获取每一个被调用的service的方法的参数
                Signature signature = joinPoint.getSignature();//这个就是正在执行的方法
                logger.info("正在执行的方法为 : {} , 参数为: {}",signature,args);
            }
         //打印返回值要在后置通知  pointcut代表切掉表达式, returning代表返回值为
    @AfterReturning(pointcut = "aopLog()",returning = "result")//参数使用的是方法中的返回值
    public void doAfter(Object result){//返回值是object因为我们可能返回集合或者别的类型列如1.2.3.4
            logger.info("方法执行结束,返回值为 {} ", JSONObject.toJSONString(result));//直接返回参数,可能是地址值,所有用alibaba的fastjson转换一下

    }
}
